package co.eam.edu.proyecto_final_empresa.servicios;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import co.eam.edu.proyecto_final_empresa.utilidades.DAOGenerico;

/**
 * EJB Generico del cual deben heredar todos los EJB.
 * @author user
 *
 * @param <T> tipo del EJB.
 */
public class EJBGenerico<T> implements Serializable {

	@PersistenceContext
	private EntityManager em;

	protected DAOGenerico dao;

	@PostConstruct
	public void postConstruct() {
		dao = new DAOGenerico(em);
	}

	/**
	 * Crea la entidad.
	 * 
	 * @param entidad
	 */
	public void crear(T entidad) {
		dao.persistir(entidad);
	}

	/**
	 * Metodo para buscar.
	 * 
	 * @param pk
	 *            , llave primaria de la entidad.
	 * @return, el objeto o null si no existe.
	 */
	public T buscar(Object pk) {
		return  dao.encontrarPorId(getType(), pk);
	}

	/**
	 * Metodo para eliminar una entidad.
	 * 
	 * @param entidad
	 */
	public void eliminar(T entidad) {
		dao.eliminar(entidad);
	}

	/**
	 * Metodo para Editar una entidad.
	 * 
	 * @param entidad
	 */
	public void editar(T entidad) {
		dao.actualizar(entidad);
	}

	/**
	 * MEtodo para listar todos los objetos de la entidad manejada por el EJB.
	 * @return
	 */
	public List<T> listarTodos(){
		return dao.listarTodos(getType());
	}
	
	/**
	 * Utilitario para saber el tipo de EJB que es esta instancia.
	 * @return el class de este EJB:
	 * @throws Exception
	 */
	public Class<T> getType()  {
		ParameterizedType superclass = (ParameterizedType) getClass()
				.getGenericSuperclass();

		return (Class<T>) superclass.getActualTypeArguments()[0];
	}

}
